// api/workspaces/workspace.validator.js
import Joi from "@hapi/joi";

class WorkspaceValidator {
  async onCreate(obj) {
    const schemaKeys = {
      name: Joi.string().required(),
      slug: Joi.string().allow('').optional(),
      description: Joi.string().allow('').optional(),
      timezone: Joi.string().allow('').optional(),
      filePath: Joi.string().allow(null).optional(),
      fileType: Joi.string().allow(null).optional(),
      fileSize: Joi.number().optional(),
      metadata: Joi.object().optional(),
      isPublic: Joi.boolean().optional(),
      teams: Joi.array().items(Joi.object({
        _id: Joi.string().hex().length(24),
        code: Joi.string(),
        name: Joi.string()
      })).optional(),
      
      // Nested structures are optional
      members: Joi.array().items(Joi.object({
        userId: Joi.string().hex().length(24).optional(),
        name: Joi.string().optional(),
        email: Joi.string().email().optional(),
        role: Joi.string().valid('admin', 'user', 'guest').optional(),
        joinedAt: Joi.date().optional()
      })).optional(),
      
      contacts: Joi.array().items(Joi.object()).optional(),
      projects: Joi.array().items(Joi.object()).optional(),
      meetings: Joi.array().items(Joi.object()).optional(),
      notes: Joi.array().items(Joi.object()).optional(),
      tasks: Joi.array().items(Joi.object()).optional(),
      
      // MySQL connection fields
      mysqlHost: Joi.string().allow(null).optional(),
      mysqlPort: Joi.number().integer().min(1).max(65535).optional(),
      mysqlUser: Joi.string().allow(null).optional(),
      mysqlPassword: Joi.string().allow(null).optional(),
      mysqlDatabase: Joi.string().allow(null).optional(),
      mysqlTable: Joi.string().allow(null).optional(),
      mysqlConnectionType: Joi.string().valid('direct', 'ssh', null).optional()
    };
    
    const schema = Joi.object().keys(schemaKeys);
    const { error } = schema.validate(obj, { abortEarly: false });
    return error;
  }

  async onUpdate(obj) {
    const schemaKeys = {
      name: Joi.string().optional(),
      slug: Joi.string().allow('').optional(),
      description: Joi.string().allow('').optional(),
      timezone: Joi.string().allow('').optional(),
      filePath: Joi.string().allow(null).optional(),
      fileType: Joi.string().allow(null).optional(),
      fileSize: Joi.number().optional(),
      metadata: Joi.object().optional(),
      isPublic: Joi.boolean().optional(),
      teams: Joi.array().items(Joi.object({
        _id: Joi.string().hex().length(24),
        code: Joi.string(),
        name: Joi.string()
      })).optional(),
      lastAccessed: Joi.date().optional(),
      
      // Nested structures are optional
      members: Joi.array().items(Joi.object({
        userId: Joi.string().hex().length(24).optional(),
        name: Joi.string().optional(),
        email: Joi.string().email().optional(),
        role: Joi.string().valid('admin', 'user', 'guest').optional(),
        joinedAt: Joi.date().optional()
      })).optional(),
      
      contacts: Joi.array().items(Joi.object()).optional(),
      projects: Joi.array().items(Joi.object()).optional(),
      meetings: Joi.array().items(Joi.object()).optional(),
      notes: Joi.array().items(Joi.object()).optional(),
      tasks: Joi.array().items(Joi.object()).optional(),
      
      // MySQL connection fields
      mysqlHost: Joi.string().allow(null).optional(),
      mysqlPort: Joi.number().integer().min(1).max(65535).optional(),
      mysqlUser: Joi.string().allow(null).optional(),
      mysqlPassword: Joi.string().allow(null).optional(),
      mysqlDatabase: Joi.string().allow(null).optional(),
      mysqlTable: Joi.string().allow(null).optional(),
      mysqlConnectionType: Joi.string().valid('direct', 'ssh', null).optional()
    };
    
    const schema = Joi.object().keys(schemaKeys);
    const { error } = schema.validate(obj, { abortEarly: false });
    return error;
  }
}

export default new WorkspaceValidator();